package pe.com.pgn.consolidadorventas.servidorestacion.dao.factory;

import java.util.List;

import org.apache.log4j.Logger;
import org.jdom.Element;

import pe.com.pgn.consolidadorventas.servidorestacion.util.Constantes;
import pe.com.pgn.consolidadorventas.servidorestacion.util.XMLUtil;

public class GlpXmlFactory {

	static Logger logger = Logger.getLogger(GlpXmlFactory.class);
	
	public static void parsearXmlDirecto(Element raiz,List<String> lineas){
		int i = 0;
		int dim = lineas.size();
		
		imprimeDebug("Inicio parseo directo");
		while(i<dim){
			String linea = lineas.get(i);
			XMLUtil.crearElementoHijo(raiz,"linea",linea);	
			i++;
		}
		imprimeDebug("Fin parseo directo");

	}
	
	public static void parsearXmlDetallado(Element raiz,List<String> lineas) {
		int i = 0;
		int tipoLinea = 0;
		int dim = lineas.size();
		imprimeDebug("Inicia parseo");
		
		Element nodoCompleto = null;
		Element ventaPrincipal = null;
		Element detalles = null;
		Element salesCards = null;
		Element opDocAntis = null;
		Element opBonus = null;
				
		while(i < dim){
			
			String cadena = lineas.get(i);
			tipoLinea = GlpXmlFactory.getTipoLinea(cadena);
			
			//La primera linea es la linea principal
			Element aux = null;	
			
			if(tipoLinea != Constantes.GLP_LINEA_RESUMEN){
				aux = GlpXmlFactory.convertirLineaNodoXml(cadena);
			}else{
				GlpXmlFactory.asignarValoresResumen(raiz,cadena);
			}
			
			switch(tipoLinea){
				case 1:{
					
					//Si ya se ha creado un nodo de la informacion anterior se agrega a la raiz
					if(nodoCompleto!=null){
						//Armamos el nodo completo y lo agregamos a la raiz
						
						//Agregamos los detalles
						if(detalles!=null){ nodoCompleto.addContent(detalles); }
						
						//Agregamos los salescards
						if(salesCards!=null){ nodoCompleto.addContent(salesCards); }
						
						//Agregamos los opDocAntis
						if(opDocAntis!=null){ nodoCompleto.addContent(opDocAntis); }
						
						//Agregamos los opBonus
						if(opBonus!=null){ nodoCompleto.addContent(opBonus); }			
						
						raiz.addContent(nodoCompleto);
						
						nodoCompleto = null;
						ventaPrincipal = null;
						detalles = null;
						salesCards = null;
						opDocAntis = null;
						opBonus = null;
						
					}
					
					//El nodo esta nulo , recien empezamos a crear
					//Creamos el nodo raiz
					nodoCompleto = XMLUtil.crearNodoXml("registroVenta");
					ventaPrincipal = aux;
					nodoCompleto.addContent(ventaPrincipal);
							
					break;
				}
				
				
				case 2:{
					if(detalles==null){
						detalles = XMLUtil.crearNodoXml("detalles");
					}
					
					if(aux!=null){
						detalles.addContent(aux);
					}
					break;
				}
				
				case 3:{
					if(salesCards==null){
						salesCards = XMLUtil.crearNodoXml("salesCards");
					}
					
					if(aux!=null){
						salesCards.addContent(aux);
					}
					break;
				}
				
				case 4:{
					if(opDocAntis==null){
						opDocAntis = XMLUtil.crearNodoXml("opDocAntis");
					}
					
					if(aux!=null){
						opDocAntis.addContent(aux);
					}
					
					break;
				}
				
				case 5:{
					if(opBonus==null){
						opBonus = XMLUtil.crearNodoXml("opBonus");
					}
					
					if(aux!=null){
						opBonus.addContent(aux);
					}
					break;
				}
				
				case 6:{
					//Cerramos el recorrido del fichero
					//Agregamos los detalles
					if(detalles!=null){ nodoCompleto.addContent(detalles); }
					
					//Agregamos los salescards
					if(salesCards!=null){ nodoCompleto.addContent(salesCards); }
					
					//Agregamos los opDocAntis
					if(opDocAntis!=null){ nodoCompleto.addContent(opDocAntis); }
					
					//Agregamos los opBonus
					if(opBonus!=null){ nodoCompleto.addContent(opBonus); }			
					
					raiz.addContent(nodoCompleto);
					break;
				}

			}	
			
			i++;
		}
		imprimeDebug("Fin parseo");
	}
	
	public static Element convertirLineaNodoXml(String linea) {

		Element nodo = null;
		String cadena = linea;		
		String valores[]=cadena.split("\\|");
		int i = 0;
		int tipoLinea = getTipoLinea(valores[i]);
		
		switch(tipoLinea){
		
			//Linea del tipo principal
			case 1:{
				nodo = parsearLineaPrincipal(valores);
				break;
			}
			
			//Nodo de detalle
			case 2:{
				nodo = parsearLineaDetalle(valores);
				break;
			}
			
			case 3:{
				nodo = parsearLineaSalesCard(valores);
				break;
			}
			
			case 4:{
				nodo = parsearLineaOpDocAnti(valores);
				break;
			}
			
			case 5:{
				nodo = parsearLineaOpBonus(valores);
				break;
			}
		}
		
		return nodo;
	}
	
	public static int getTipoLinea(String valor) {
		int tipoLinea = 0;
		try{
			tipoLinea = Integer.parseInt(valor.substring(1,2));
		}catch(NumberFormatException nfe){
			logger.error(nfe.getMessage());
			tipoLinea = 0;
		}
		return tipoLinea;
	}
	
	//Aqui parseamos solo la linea principal
	public static Element parsearLineaPrincipal(String valores[]){
		
		Element nodo = XMLUtil.crearNodoXml("principal");
		int i = 1;
		if(valores.length>0){
			
			nodo.setAttribute("docTypeId",valores[i]);i=i+1;
			nodo.setAttribute("nbrDocument",valores[i]);i=i+1;
			nodo.setAttribute("siteId",valores[i]);i=i+1;
			
			XMLUtil.crearElementoHijo(nodo,"typePaymentId",valores[i]);i=i+1;
			XMLUtil.crearElementoHijo(nodo,"stkInventory",valores[i]);i=i+1;
			
			XMLUtil.crearElementoHijo(nodo,"docStatusId",valores[i]);i=i+1;
			XMLUtil.crearElementoHijo(nodo,"termId",valores[i]);i=i+1;
			XMLUtil.crearElementoHijo(nodo,"salesPerId",valores[i]);i=i+1;
			XMLUtil.crearElementoHijo(nodo,"userId",valores[i]);i=i+1;
			XMLUtil.crearElementoHijo(nodo,"dateDoc",valores[i]);i=i+1;
			XMLUtil.crearElementoHijo(nodo,"dateProceSales",valores[i]);i=i+1;
			XMLUtil.crearElementoHijo(nodo,"perPost",valores[i]);i=i+1;	
			XMLUtil.crearElementoHijo(nodo,"totalPen",valores[i]);i=i+1;
			XMLUtil.crearElementoHijo(nodo,"subTotalPen",valores[i]);i=i+1;
			XMLUtil.crearElementoHijo(nodo,"taxIgvPen",valores[i]);i=i+1;
			XMLUtil.crearElementoHijo(nodo,"totCashPen",valores[i]);i=i+1;
				
			XMLUtil.crearElementoHijo(nodo,"custIdss",valores[i]);i=i+1;
			
			XMLUtil.crearElementoHijo(nodo,"taxRegnBr",valores[i]);i=i+1;
			XMLUtil.crearElementoHijo(nodo,"placa",valores[i]);i=i+1;
			XMLUtil.crearElementoHijo(nodo,"nbrBonus",valores[i]);i=i+1;
			
			XMLUtil.crearElementoHijo(nodo,"salesPoint",valores[i]);i=i+1;
			XMLUtil.crearElementoHijo(nodo,"kilometraje",valores[i]);i=i+1;
			XMLUtil.crearElementoHijo(nodo,"businessType",valores[i]);i=i+1;
			XMLUtil.crearElementoHijo(nodo,"user9",valores[i]);i=i+1;
			XMLUtil.crearElementoHijo(nodo,"custName",valores[i]);i=i+1;
			XMLUtil.crearElementoHijo(nodo,"filaVenDet",valores[i]);i=i+1;
			XMLUtil.crearElementoHijo(nodo,"filaVenSal",valores[i]);i=i+1;
			XMLUtil.crearElementoHijo(nodo,"filaVenDoc",valores[i]);i=i+1;
			XMLUtil.crearElementoHijo(nodo,"filaVenBon",valores[i]);i=i+1;
			XMLUtil.crearElementoHijo(nodo,"chkVenDet",valores[i]);i=i+1;
			XMLUtil.crearElementoHijo(nodo,"chkVenSal",valores[i]);i=i+1;
			
		}else{
			nodo = null;
		}
		
		return nodo;
	}
	
	//Linea de detalle
	public static Element parsearLineaDetalle(String valores[]){
		Element nodo = XMLUtil.crearNodoXml("regDetalle");
		
		int i = 1;
		if(valores.length>0){
			
			nodo.setAttribute("docTypeId",valores[i]);i=i+1;
			nodo.setAttribute("nbrDocument",valores[i]);i=i+1;
			nodo.setAttribute("siteId",valores[i]);i=i+1;
			nodo.setAttribute("sequence",valores[i]);i=i+1;
			nodo.setAttribute("invtidsku",valores[i]);i=i+1;
			nodo.setAttribute("docStatusId",valores[i]);i=i+1;
			
			XMLUtil.crearElementoHijo(nodo,"dateDoc",valores[i]);i=i+1;
			XMLUtil.crearElementoHijo(nodo,"dateProceSales",valores[i]);i=i+1;
			
			XMLUtil.crearElementoHijo(nodo,"perPost",valores[i]);i=i+1;
			XMLUtil.crearElementoHijo(nodo,"nbrTurn",valores[i]);i=i+1;
			XMLUtil.crearElementoHijo(nodo,"nbrSide",valores[i]);i=i+1;
			XMLUtil.crearElementoHijo(nodo,"porcentTaxIgv",valores[i]);i=i+1;
			XMLUtil.crearElementoHijo(nodo,"totalPen",valores[i]);i=i+1;
			XMLUtil.crearElementoHijo(nodo,"taxPen",valores[i]);i=i+1;
			XMLUtil.crearElementoHijo(nodo,"stkItem",valores[i]);i=i+1;
			XMLUtil.crearElementoHijo(nodo,"slsPrice",valores[i]);i=i+1;
			XMLUtil.crearElementoHijo(nodo,"slsPriceSale",valores[i]);i=i+1;
			XMLUtil.crearElementoHijo(nodo,"stdCostPen",valores[i]);i=i+1;
			XMLUtil.crearElementoHijo(nodo,"descrInventory",valores[i]);i=i+1;
			XMLUtil.crearElementoHijo(nodo,"qty",valores[i]);i=i+1;
			XMLUtil.crearElementoHijo(nodo,"userId",valores[i]);i=i+1;
			
		}else{
			nodo = null;
		}
		return nodo;
	}
	
	//Linea SalesCard
	public static Element parsearLineaSalesCard(String valores[]){
		Element nodo = XMLUtil.crearNodoXml("regSalesCard");
		int i = 1;
		if(valores.length>0){
			nodo.setAttribute("docTypeId",valores[i]);i=i+1;
			nodo.setAttribute("nbrDocument",valores[i]);i=i+1;
			nodo.setAttribute("siteId",valores[i]);i=i+1;
			nodo.setAttribute("sequence",valores[i]);i=i+1;
			nodo.setAttribute("cardId",valores[i]);i=i+1;
			nodo.setAttribute("nbrCard",valores[i]);i=i+1;
			nodo.setAttribute("totCardPen",valores[i]);i=i+1;
			XMLUtil.crearElementoHijo(nodo,"dateProceSales",valores[i]);
		}else{
			nodo = null;
		}
		return nodo;
	}
	
	//Linea OpDocAnti
	public static Element parsearLineaOpDocAnti(String valores[]){
		Element nodo = XMLUtil.crearNodoXml("regOpDocAnti");
		int i = 1;
		if(valores.length>0){
			nodo.setAttribute("docTypeId",valores[i]);i=i+1;
			nodo.setAttribute("nbrDocument",valores[i]);i=i+1;
			nodo.setAttribute("siteId",valores[i]);i=i+1;
			XMLUtil.crearElementoHijo(nodo,"dateProce",valores[i]);

		}else{
			nodo = null;
		}
		return nodo;
	}
	
	
	public static Element parsearLineaOpBonus(String valores[]){
		Element nodo = XMLUtil.crearNodoXml("regOpDocAnti");
		int i = 1;
		if(valores.length>0){
			nodo.setAttribute("docTypeId",valores[i]);i=i+1;
			nodo.setAttribute("nbrDocument",valores[i]);i=i+1;
			nodo.setAttribute("siteId",valores[i]);i=i+1;
			nodo.setAttribute("custIdss",valores[i]);i=i+1;
			XMLUtil.crearElementoHijo(nodo,"nbrBonus",valores[i]);i=i+1;
			XMLUtil.crearElementoHijo(nodo,"dateProceSales",valores[i]);
		}else{
			nodo = null;
		}
		
		return nodo;
	}
	
	//Aqui asignamos los valores del resumen a la respuesta XML
	public static void asignarValoresResumen(Element raiz,String linea){
		String datosResumen[]=linea.split("\\|");
		try{
			raiz.setAttribute("cantidadVentas",datosResumen[1]);
			raiz.setAttribute("ventaTotal",datosResumen[2]);
		}catch(ArrayIndexOutOfBoundsException e){
			logger.error(e.getMessage());
		}
	}
	
	private static void imprimeDebug(String accion){
		if(logger.isDebugEnabled()){ 
			logger.debug(accion); 
		}
	}
}
